package calculadora;

import java.sql.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;

public class Calculadora {

  private LinkedHashMap<Integer, RenglonTrans> tablaAgente1;
  private LinkedHashMap<Integer, RenglonTrans> tablaAgente2;
  private LinkedHashMap<Integer, RenglonTrans> tablaPromotor1;
  private LinkedHashMap<Integer, RenglonTrans> tablaPromotor2;
  private ArrayList<Integer> llavesAgente1;
  private ArrayList<Integer> llavesAgente2;
  private ArrayList<Integer> llavesPromotor1;
  private ArrayList<Integer> llavesPromotor2;
  private ArrayList<Integer> acumuladoAgente1;
  private ArrayList<Integer> acumuladoAgente2;
  private ArrayList<Integer> acumuladoPromotor1;
  private ArrayList<Integer> acumuladoPromotor2;
  private Statement st;
  private int mesSeleccionado;

  public Calculadora(int indiceMes, Statement st) {
    this.tablaAgente1 = new LinkedHashMap<Integer, RenglonTrans>();
    this.tablaAgente2 = new LinkedHashMap<Integer, RenglonTrans>();
    this.tablaPromotor1 = new LinkedHashMap<Integer, RenglonTrans>();
    this.tablaPromotor2 = new LinkedHashMap<Integer, RenglonTrans>();
    this.llavesAgente1 = new ArrayList<Integer>();
    this.llavesAgente2 = new ArrayList<Integer>();
    this.llavesPromotor1 = new ArrayList<Integer>();
    this.llavesPromotor2 = new ArrayList<Integer>();
    this.acumuladoAgente1 = new ArrayList<Integer>();
    this.acumuladoAgente2 = new ArrayList<Integer>();
    this.acumuladoPromotor1 = new ArrayList<Integer>();
    this.acumuladoPromotor2 = new ArrayList<Integer>();
    this.mesSeleccionado = indiceMes;
    this.st = st;
  }

  public ArrayList<Integer> getAcumuladoAgente1() {
    return acumuladoAgente1;
  }

  public ArrayList<Integer> getAcumuladoAgente2() {
    return acumuladoAgente2;
  }

  public ArrayList<Integer> getAcumuladoPromotor1() {
    return acumuladoPromotor1;
  }

  public ArrayList<Integer> getAcumuladoPromotor2() {
    return acumuladoPromotor2;
  }

  public int getIndiceMesSeleccionado() {
    return mesSeleccionado;
  }

  public ArrayList<Integer> getLlavesAgente1() {
    return llavesAgente1;
  }

  public ArrayList<Integer> getLlavesAgente2() {
    return llavesAgente2;
  }

  public ArrayList<Integer> getLlavesPromotor1() {
    return llavesPromotor1;
  }

  public ArrayList<Integer> getLlavesPromotor2() {
    return llavesPromotor2;
  }

  public LinkedHashMap<Integer, RenglonTrans> getTablaAgente1() {
    return tablaAgente1;
  }

  public LinkedHashMap<Integer, RenglonTrans> getTablaAgente2() {
    return tablaAgente2;
  }

  public LinkedHashMap<Integer, RenglonTrans> getTablaPromotor1() {
    return tablaPromotor1;
  }

  public LinkedHashMap<Integer, RenglonTrans> getTablaPromotor2() {
    return tablaPromotor2;
  }

  /*
   * Ejecuta el query que nos devuelve el acumulado por ramo de cada agente en la base
   * de Datos tomando en cuenta los agentes que no tienen marca o que son DXP y agrega 
   * los datos de los agentes en un hash y un arraylist con los id's de los agentes
   */
  public void ejecutaQueryAcuAgente1(Statement st) throws SQLException {
    ResultSet res = null;
    try {
      res = st.executeQuery("SELECT periodo,id_agente, nombre_agente, id_ramo_contable, marca,"
              + " sistema_origen, SUM(prima_pagada) AS prima, SUM(sinies_total) AS siniestros,ramo, columna FROM convenios_pp "
              + " WHERE periodo BETWEEN 1  AND " + this.mesSeleccionado + " "
              + "GROUP BY periodo, id_agente, nombre_agente, sistema_origen, id_ramo_contable, "
              + "ramo, columna, marca");
    } catch (Exception ex) {
      System.err.println("Warning: SELECT " + ex.getMessage());
    }

    RenglonTrans r = null;
    while (res.next()) {
      if (this.tablaAgente1.containsKey(res.getInt("id_agente"))) {
        r = this.tablaAgente1.get(res.getInt("id_agente"));
      } else {
        r = new RenglonTrans();
        this.llavesAgente1.add(res.getInt("id_agente"));
        r.inserta(1, res.getString("id_agente"));
        r.inserta(3, res.getString("nombre_agente"));
      }
      if (res.getInt("marca") == 0 || res.getInt("marca") == 1) {
        r.inserta(res.getInt("columna") + 3, res.getInt("ramo"), res.getDouble("prima"));
        if (res.getInt("marca") == 0) {
          r.insertaSiniestros(res.getInt("ramo"), res.getDouble("siniestros"));
        }
      }
      r.insertaTotal();
      this.tablaAgente1.put(res.getInt("id_agente"), r);
    }
  }

  /*
   * Ejecuta el query que nos devuelve el acumulado por ramo de cada promotor en la base
   * de Datos tomando en cuenta los promotores que no tienen marca o que son DXP y agrega 
   * los datos de los agentes en un hash y un arraylist con los id's de los promotores
   */
  public void ejecutaQueryAcuProm1(Statement st) throws SQLException {
    ResultSet res = null;
    try {
      res = st.executeQuery("SELECT periodo,id_promotoria, nom_promotoria, id_ramo_contable, marca,"
              + "sistema_origen, SUM(prima_pagada) AS prima, SUM(sinies_total) AS siniestros, ramo, columna FROM convenios_pp "
              + "WHERE periodo BETWEEN  1 AND " + this.mesSeleccionado + " "
              + "GROUP BY periodo,id_promotoria, nom_promotoria, sistema_origen, id_ramo_contable, "
              + "ramo, columna,marca");
    } catch (Exception ex) {
      System.err.println("Warning: SELECT " + ex.getMessage());
    }
    RenglonTrans r = null;
    while (res.next()) {
      if (this.tablaPromotor1.containsKey(res.getInt("id_promotoria"))) {
        r = this.tablaPromotor1.get(res.getInt("id_promotoria"));
      } else {
        r = new RenglonTrans();
        this.llavesPromotor1.add(res.getInt("id_promotoria"));
        r.inserta(2, res.getString("id_promotoria"));
        r.inserta(3, res.getString("nom_promotoria"));
        //System.out.println("RenglonTransPromotores 1" + r.getRenglones()[2] + " " + r.getRenglones()[3]);
      }
      if (res.getInt("marca") == 0 || res.getInt("marca") == 1) {
        r.inserta(res.getInt("columna") + 3, res.getInt("ramo"), res.getDouble("prima"));
        if (res.getInt("marca") == 0) {
          r.insertaSiniestros(res.getInt("ramo"), res.getDouble("siniestros"));
        }
      }
      r.insertaTotal();
      this.tablaPromotor1.put(res.getInt("id_promotoria"), r);
    }
  }

  /*
   * Ejecuta el query que nos devuelve el acumulado por ramo de cada agente en la base
   * de Datos tomando en cuenta los agentes que no tienen marca y agrega 
   * los datos de los agentes en un hash y un arraylist con los id's de los agentes
   */
  public void ejecutaQueryAcuAgente2(Statement st) throws SQLException {
    ResultSet res = null;
    try {
      res = st.executeQuery("SELECT periodo,id_agente, nombre_agente, id_ramo_contable, "
              + "sistema_origen, SUM(prima_pagada) AS prima, ramo, columna "
              + "FROM convenios_pp WHERE marca=0 AND periodo BETWEEN 1 "
              + "AND " + this.mesSeleccionado + " GROUP BY periodo, id_agente, nombre_agente, sistema_origen,"
              + " id_ramo_contable, ramo, columna");
    } catch (Exception ex) {
      System.err.println("Warning: SELECT " + ex.getMessage());
    }
    RenglonTrans r = null;
    while (res.next()) {
      if (this.tablaAgente2.containsKey(res.getInt("id_agente"))) {
        r = this.tablaAgente2.get(res.getInt("id_agente"));
      } else {
        r = new RenglonTrans();
        this.llavesAgente2.add(res.getInt("id_agente"));
        r.inserta(1, res.getString("id_agente"));
        r.inserta(3, res.getString("nombre_agente"));
      }
      int ramo = res.getInt("id_ramo_contable");
      if (ramo == 7) {
        //System.out.println("El ramo es:" + res.getInt("id_ramo_contable"));
        r.inserta(res.getInt("columna") + 3, res.getInt("ramo"), 0.0);
      } else {
        r.inserta(res.getInt("columna") + 3, res.getInt("ramo"), res.getDouble("prima"));
        r.insertaTotal();
        r.insetaAcud();
        r.insetaAcuv();
        r.insetaAcua();
        this.tablaAgente2.put(res.getInt("id_agente"), r);
      }
    }
  }

  /*
   * Ejecuta el query que nos devuelve el acumulado por ramo de cada promotor en la base
   * de Datos tomando en cuenta los promotores que no tienen marca y agrega 
   * los datos de los promotores en un hash y un arraylist con los id's de los promotores
   */
  public void ejecutaQueryAcuProm2(Statement st) throws SQLException {
    ResultSet res = null;
    try {
      res = st.executeQuery("SELECT periodo, id_promotoria, nom_promotoria, "
              + "id_ramo_contable, sistema_origen, SUM(prima_pagada) "
              + "AS prima, SUM(sinies_total) AS siniestros,ramo, columna FROM convenios_pp WHERE marca=0 AND periodo "
              + "BETWEEN 1 AND " + this.mesSeleccionado + " GROUP BY periodo, id_promotoria, "
              + "nom_promotoria, sistema_origen, id_ramo_contable, ramo, columna");
    } catch (Exception ex) {
      System.err.println("Warning: SELECT " + ex.getMessage());
    }

    RenglonTrans r = null;
    while (res.next()) {
      if (this.tablaPromotor2.containsKey(res.getInt("id_promotoria"))) {
        r = this.tablaPromotor2.get(res.getInt("id_promotoria"));
      } else {
        r = new RenglonTrans();
        this.llavesPromotor2.add(res.getInt("id_promotoria"));
        r.inserta(2, res.getString("id_promotoria"));
        r.inserta(3, res.getString("nom_promotoria"));
      }

      r.inserta(res.getInt("columna") + 3, res.getInt("ramo"), res.getDouble("prima"));
      r.insertaTotal();
      r.insetaAcud();
      r.insetaAcuv();
      r.insetaAcua();
      this.tablaPromotor2.put(res.getInt("id_promotoria"), r);
    }
  }

  /*
   * Genera los totales  los porcentajes de bono por cada agente en la tabla de condiciones
   * para el Acumulado 1
   * 
   */
  public void hazCalculosAgente1() throws SQLException {
    int mes = this.mesSeleccionado;
    Iterator<Integer> iterator = this.llavesAgente1.iterator();
    RenglonTrans renglon = null;
    double meta = 0;
    CalculadoraDevengado devengado = new CalculadoraDevengado(mes, st);
    devengado.cargaDevengadosAgente();
    while (iterator.hasNext()) {
      renglon = this.tablaAgente1.get(iterator.next());
      double idd = Double.parseDouble(renglon.getRenglones()[1]);
      int id = (int) idd;
      Condiciones cond = new Condiciones(st);
      if (cond.getCondicionesAgente(id, mes)) {
        if (cond.getAg_promotor().toLowerCase().equals("agente")) {

          if (renglon.getRenglones()[24] == null) {
            renglon.inserta(24, 0.0);
          }
          if (renglon.getRenglones()[25] == null) {
            renglon.inserta(25, 0.0);
          }
          if (renglon.getRenglones()[26] == null) {
            renglon.inserta(26, 0.0);
          }

          if (devengado.getTablaAgenteDevengado().get(id) != null & id != 0) {
            renglon.inserta(27, String.valueOf(devengado.getAcuAutosAgen(id)));
            renglon.inserta(28, String.valueOf(devengado.getAcuDañosAgen(id)));
            renglon.inserta(29, String.valueOf(devengado.getAcuPersonasAgen(id)));
            //System.out.println("Se agregan los valores de devengado "+renglon.getRenglones()[25]+" "+renglon.getRenglones()[26]+" "+renglon.getRenglones()[27]);
          } else {
            renglon.inserta(27, 0.0);
            renglon.inserta(28, 0.0);
            renglon.inserta(29, 0.0);
          }

          if (cond.getAdicional1() != 0 & existeIdAgente(cond.getAdicional1())) {
            renglon = sumaAgente1(id, cond.getAdicional1());
            if (devengado.getTablaAgenteDevengado().get(cond.getAdicional1()) != null) {
              renglon.inserta(27, devengado.getAcuAutosAgen(cond.getAdicional1()));
              renglon.inserta(28, devengado.getAcuDañosAgen(cond.getAdicional1()));
              renglon.inserta(29, devengado.getAcuPersonasAgen(cond.getAdicional1()));
            }
          }
          if (cond.getAdicional2() != 0 & existeIdAgente(cond.getAdicional2())) {
            renglon = sumaAgente1(id, cond.getAdicional2());
            if (devengado.getTablaAgenteDevengado().get(cond.getAdicional2()) != null) {
              renglon.inserta(27, devengado.getAcuAutosAgen(cond.getAdicional2()));
              renglon.inserta(28, devengado.getAcuDañosAgen(cond.getAdicional2()));
              renglon.inserta(29, devengado.getAcuPersonasAgen(cond.getAdicional2()));
            }
          }

          double metaperiodo = cond.getMetaPeriodo(mes);
          double alcance;
          renglon.inserta(0, cond.getAg_promotor());
          renglon.inserta(2, cond.getIdp());
          //System.out.println("RenglonTransAgentes 1" + renglon.getRenglones()[0] + " " + renglon.getRenglones()[1] + " " + renglon.getRenglones()[2] + " " + renglon.getRenglones()[3]);
          double total = renglon.getTotal();
          meta += cond.getRechazos();
          total /= meta;
          renglon.inserta(19, String.valueOf(cond.getRechazos()));
          renglon.inserta(20, String.valueOf(Double.parseDouble(renglon.getRenglones()[18]) + Double.parseDouble(renglon.getRenglones()[19])));
          double metaAlcance = Double.parseDouble(renglon.getRenglones()[20]);
          renglon.inserta(21, String.valueOf(metaperiodo));
          if (metaperiodo == 0) {
            alcance = 1;
          }
          alcance = metaAlcance / metaperiodo;
          if (alcance > 1) {
            alcance = 1;
          }
          renglon.inserta(22, String.valueOf(alcance));//Porcentaje meta alcanzada
          double metaAlcanzada80 = 0.0;
          metaAlcanzada80 = alcance * 1.25;
          if (metaAlcanzada80 > 1) {
            metaAlcanzada80 = 1;
          }
          renglon.inserta(23, String.valueOf(metaAlcanzada80));
          double ica = -1.0;
          double icd = -1.0;
          double icp = -1.0;
          if (Double.parseDouble(renglon.getRenglones()[27]) == 0) {
            ica = 0;
          }
          if (Double.parseDouble(renglon.getRenglones()[28]) == 0) {
            icd = 0;
          }
          if (Double.parseDouble(renglon.getRenglones()[29]) == 0) {
            icp = 0;
          }
          if (Double.parseDouble(renglon.getRenglones()[24]) > 0 & Double.parseDouble(renglon.getRenglones()[27]) <= 0) {
            ica = 1.0;
          }
          if (Double.parseDouble(renglon.getRenglones()[24]) < 0 & Double.parseDouble(renglon.getRenglones()[27]) > 0) {
            ica = 0.0;
          }
          if (Double.parseDouble(renglon.getRenglones()[24]) == 0) {
            ica = 0.0;
          }
          if (Double.parseDouble(renglon.getRenglones()[25]) > 0 & Double.parseDouble(renglon.getRenglones()[28]) <= 0) {
            icd = 1.0;
          }
          if (Double.parseDouble(renglon.getRenglones()[25]) < 0 & Double.parseDouble(renglon.getRenglones()[28]) > 0) {
            icd = 0.0;
          }
          if (Double.parseDouble(renglon.getRenglones()[25]) == 0) {
            icd = 0.0;
          }
          if (Double.parseDouble(renglon.getRenglones()[26]) > 0 & Double.parseDouble(renglon.getRenglones()[29]) <= 0) {
            icp = 1.0;
          }
          if (Double.parseDouble(renglon.getRenglones()[26]) < 0 & Double.parseDouble(renglon.getRenglones()[29]) > 0) {
            icp = 0.0;
          }
          if (Double.parseDouble(renglon.getRenglones()[26]) == 0) {
            icp = 0.0;
          }
          if (ica != 0.0 & ica != 1.0) {
            ica = Double.parseDouble(renglon.getRenglones()[24]) / Double.parseDouble(renglon.getRenglones()[27]);
          }
          if (icd != 0.0 & icd != 1.0) {
            icd = Double.parseDouble(renglon.getRenglones()[25]) / Double.parseDouble(renglon.getRenglones()[28]);
          }
          if (icp != 0.0 & icp != 1.0) {
            icp = Double.parseDouble(renglon.getRenglones()[26]) / Double.parseDouble(renglon.getRenglones()[29]);
          }
          if (ica < 0) {
            ica = 0;
          }
          if (icd < 0) {
            icd = 0;
          }
          if (icp < 0) {
            icp = 0;
          }
          if (Math.abs(ica) > 1) {
            ica = 1.0;
          }
          if (Math.abs(icd) > 1) {
            icd = 1.0;
          }
          if (Math.abs(icp) > 1) {
            icp = 1.0;
          }
          renglon.inserta(30, ica);
          renglon.inserta(31, icd);
          renglon.inserta(32, icp);
          renglon.inserta(33, cond.valorAutos(ica));
          renglon.inserta(34, cond.valorDaños(icd));
          renglon.inserta(35, cond.valorPersonas(icp));
          renglon.inserta(36, cond.valorAutos(ica) * metaAlcanzada80);
          renglon.inserta(37, cond.valorDaños(icd) * metaAlcanzada80);
          renglon.inserta(38, cond.valorPersonas(icp) * metaAlcanzada80);
          this.tablaAgente1.put(id, renglon);
          this.acumuladoAgente1.add(id);
        }
      }
    }
  }

  /*
   * Genera los totales  los porcentajes de bono por cada agente en la tabla de condiciones
   * para el Acumulado 2
   */
  public void hazCalculosAgente2() throws SQLException {
    Iterator<Integer> it = this.llavesAgente2.iterator();
    RenglonTrans re = null;
    int mes = this.mesSeleccionado;
    Iterator<Integer> iterator = this.llavesAgente2.iterator();
    RenglonTrans renglon = null;
    double meta = 0;
    while (iterator.hasNext()) {
      renglon = this.tablaAgente2.get(iterator.next());
      double idd = Double.parseDouble(renglon.getRenglones()[1]);
      int id = (int) idd;
      Condiciones cond = new Condiciones(st);
      if (cond.getCondicionesAgente(id, mes)) {
        if (cond.getAg_promotor().toLowerCase().equals("agente")) {
          if (cond.getAdicional1() != -1 && existeIdAgente(cond.getAdicional1())) {
            renglon = sumaAgente2(id, cond.getAdicional1());
          }
          if (cond.getAdicional2() != -1 && existeIdAgente(cond.getAdicional2())) {
            renglon = sumaAgente2(id, cond.getAdicional2());
          }

          double metaperiodo = cond.getMetaPeriodo(mes);
          double alcance;
          renglon.inserta(0, cond.getAg_promotor());
          renglon.inserta(2, cond.getIdp());
          double total = renglon.getTotal();
          meta += cond.getRechazos();
          total /= meta;
          renglon.inserta(19, String.valueOf(cond.getRechazos()));
          renglon.inserta(20, String.valueOf(Double.parseDouble(renglon.getRenglones()[18]) + Double.parseDouble(renglon.getRenglones()[19])));
          double metaAlcance = Double.parseDouble(renglon.getRenglones()[20]);
          renglon.inserta(21, String.valueOf(metaperiodo));
          if (metaperiodo == 0) {
            alcance = 1;
          }
          alcance = metaAlcance / metaperiodo;
          if (alcance > 1) {
            alcance = 1;
          }
          renglon.inserta(22, String.valueOf(alcance));//Porcentaje meta alcanzada
          renglon.getRenglones()[22] = String.valueOf(alcance);
          this.tablaAgente2.put(id, renglon);
          this.acumuladoAgente2.add(id);

        }
      }
    }
    /*Iterator<Integer> ite = this.acumuladoAgente2.iterator();
    RenglonTrans ree = null;
    while (ite.hasNext()) {
      String salida = "";
      ree = this.tablaAgente2.get(ite.next());
      for (int i = 0; i < ree.getRenglones().length; i++) {
        salida += " i : " + i + " " + ree.getRenglones()[i];
      }
      System.out.println("Revision acumulado 2 : " + salida + "\n");
    }*/

  }

  /*
   * Genera los totales  los porcentajes de bono por cada promotor en la tabla de condiciones
   * para el Acumulado 1
   */
  public void hazCalculosPromotor1() throws SQLException {
    int mes = this.mesSeleccionado;
    Iterator<Integer> iterator = this.llavesPromotor1.iterator();
    RenglonTrans renglon = null;
    double meta = 0;
    CalculadoraDevengado devengado = new CalculadoraDevengado(mes, st);
    devengado.cargaDevengadosPromotor();
    while (iterator.hasNext()) {
      Integer clave = iterator.next();
      //System.out.println(clave);
      renglon = this.tablaPromotor1.get(clave);
      double idd = 0;
      if (renglon.getRenglones()[2] != null) {
        idd = Double.parseDouble(renglon.getRenglones()[2]);
      }
      int id = (int) idd;
      Condiciones cond = new Condiciones(st);
      if (cond.getCondicionesPromotor(id, mes)) {
        if (cond.getAg_promotor().toLowerCase().equals("promotor")) {

          if (renglon.getRenglones()[24] == null) {
            renglon.inserta(24, 0.0);
          }
          if (renglon.getRenglones()[25] == null) {
            renglon.inserta(25, 0.0);
          }
          if (renglon.getRenglones()[26] == null) {
            renglon.inserta(26, 0.0);
          }

          if (devengado.getTablaPromotorDevengado().get(id) != null & id != 0) {
            renglon.inserta(27, String.valueOf(devengado.getAcuAutosProm(id)));
            renglon.inserta(28, String.valueOf(devengado.getAcuDañosProm(id)));
            renglon.inserta(29, String.valueOf(devengado.getAcuPersonasProm(id)));
            //System.out.println("Se agregan los valores de devengado "+renglon.getRenglones()[26]+" "+renglon.getRenglones()[27]+" "+renglon.getRenglones()[28]);
          } else {
            renglon.inserta(27, 0.0);
            renglon.inserta(28, 0.0);
            renglon.inserta(29, 0.0);
          }

          if (cond.getAdicional1() != 0 && existeIdPromotor(cond.getAdicional1())) {
            renglon = sumaPromotor1(id, cond.getAdicional1());
            if (devengado.getTablaPromotorDevengado().get(cond.getAdicional1()) != null) {
              renglon.inserta(27, devengado.getAcuAutosProm(cond.getAdicional1()));
              renglon.inserta(28, devengado.getAcuDañosProm(cond.getAdicional1()));
              renglon.inserta(29, devengado.getAcuPersonasProm(cond.getAdicional1()));
            }
          }
          if (cond.getAdicional2() != 0 && existeIdPromotor(cond.getAdicional2())) {
            renglon = sumaPromotor1(id, cond.getAdicional2());
            if (devengado.getTablaPromotorDevengado().get(cond.getAdicional2()) != null) {
              renglon.inserta(27, devengado.getAcuAutosProm(cond.getAdicional2()));
              renglon.inserta(28, devengado.getAcuDañosProm(cond.getAdicional2()));
              renglon.inserta(29, devengado.getAcuPersonasProm(cond.getAdicional2()));
            }
          }

          double metaperiodo = cond.getMetaPeriodo(mes);
          double alcance;
          renglon.inserta(0, cond.getAg_promotor());
          renglon.inserta(1, cond.getIda());
          //System.out.println("RenglonTransPromotores 1" + renglon.getRenglones()[0] + " " + renglon.getRenglones()[1] + " " + renglon.getRenglones()[2] + " " + renglon.getRenglones()[3]);
          double total = renglon.getTotal();
          meta += cond.getRechazos();
          total /= meta;
          renglon.inserta(19, String.valueOf(cond.getRechazos()));
          renglon.inserta(20, String.valueOf(Double.parseDouble(renglon.getRenglones()[18]) + Double.parseDouble(renglon.getRenglones()[19])));
          double metaAlcance = Double.parseDouble(renglon.getRenglones()[20]);
          renglon.inserta(21, String.valueOf(metaperiodo));
          if (metaperiodo == 0) {
            alcance = 1;
          }
          alcance = metaAlcance / metaperiodo;
          if (alcance > 1) {
            alcance = 1;
          }
          renglon.inserta(22, String.valueOf(alcance));//Porcentaje meta alcanzada

          double metaAlcanzada80 = 0.0;
          metaAlcanzada80 = alcance * 1.25;
          if (metaAlcanzada80 > 1) {
            metaAlcanzada80 = 1;
          }
          renglon.inserta(23, String.valueOf(metaAlcanzada80));
          //23 autos , 24 personas y 25 daños son de las sumas de siniestros
          //inserta devengadas por autos, daños y personas aqui 26 autos, 27 personas  y 28 daños
          double ica = -1.0;
          double icd = -1.0;
          double icp = -1.0;
          if (Double.parseDouble(renglon.getRenglones()[27]) == 0) {
            ica = 0;
          }
          if (Double.parseDouble(renglon.getRenglones()[28]) == 0) {
            icd = 0;
          }
          if (Double.parseDouble(renglon.getRenglones()[29]) == 0) {
            icp = 0;
          }
          if (Double.parseDouble(renglon.getRenglones()[24]) > 0 & Double.parseDouble(renglon.getRenglones()[27]) <= 0) {
            ica = 1.0;
          }
          if (Double.parseDouble(renglon.getRenglones()[24]) < 0 & Double.parseDouble(renglon.getRenglones()[27]) > 0) {
            ica = 0.0;
          }
          if (Double.parseDouble(renglon.getRenglones()[24]) == 0) {
            ica = 0.0;
          }
          if (Double.parseDouble(renglon.getRenglones()[25]) > 0 & Double.parseDouble(renglon.getRenglones()[28]) <= 0) {
            icd = 1.0;
          }
          if (Double.parseDouble(renglon.getRenglones()[25]) < 0 & Double.parseDouble(renglon.getRenglones()[28]) > 0) {
            icd = 0.0;
          }
          if (Double.parseDouble(renglon.getRenglones()[25]) == 0) {
            icd = 0.0;
          }
          if (Double.parseDouble(renglon.getRenglones()[26]) > 0 & Double.parseDouble(renglon.getRenglones()[29]) <= 0) {
            icp = 1.0;
          }
          if (Double.parseDouble(renglon.getRenglones()[26]) < 0 & Double.parseDouble(renglon.getRenglones()[29]) > 0) {
            icp = 0.0;
          }
          if (Double.parseDouble(renglon.getRenglones()[26]) == 0) {
            icp = 0.0;
          }
          if (ica != 0.0 & ica != 1.0) {
            ica = Double.parseDouble(renglon.getRenglones()[24]) / Double.parseDouble(renglon.getRenglones()[27]);
          }
          if (icd != 0.0 & icd != 1.0) {
            icd = Double.parseDouble(renglon.getRenglones()[25]) / Double.parseDouble(renglon.getRenglones()[28]);
          }
          if (icp != 0.0 & icp != 1.0) {
            icp = Double.parseDouble(renglon.getRenglones()[26]) / Double.parseDouble(renglon.getRenglones()[29]);
          }
          if (ica < 0) {
            ica = 0;
          }
          if (icd < 0) {
            icd = 0;
          }
          if (icp < 0) {
            icp = 0;
          }
          if (Math.abs(ica) > 1) {
            ica = 1.0;
          }
          if (Math.abs(icd) > 1) {
            icd = 1.0;
          }
          if (Math.abs(icp) > 1) {
            icp = 1.0;
          }
          renglon.inserta(30, ica);
          renglon.inserta(31, icd);
          renglon.inserta(32, icp);
          renglon.inserta(33, cond.valorAutos(ica));
          renglon.inserta(34, cond.valorDaños(icd));
          renglon.inserta(35, cond.valorPersonas(icp));
          renglon.inserta(36, cond.valorAutos(ica) * metaAlcanzada80);
          renglon.inserta(37, cond.valorDaños(icd) * metaAlcanzada80);
          renglon.inserta(38, cond.valorPersonas(icp) * metaAlcanzada80);
          this.tablaPromotor1.put(id, renglon);
          this.acumuladoPromotor1.add(id);
        }
      }
    }
  }

  /*
   * Genera los totales  los porcentajes de bono por cada promotor en la tabla de condiciones
   * para el Acumulado 2
   */
  public void hazCalculosPromotor2() throws SQLException {
    int mes = this.mesSeleccionado;
    Iterator<Integer> iterator = this.llavesPromotor2.iterator();
    RenglonTrans renglon = null;
    double meta = 0;
    while (iterator.hasNext()) {
      renglon = this.tablaPromotor2.get(iterator.next());
      double idd = 0;
      if (renglon.getRenglones()[2] != null) {
        idd = Integer.parseInt(renglon.getRenglones()[2]);
      }
      int id = (int) idd;
      Condiciones cond = new Condiciones(st);
      if (cond.getCondicionesPromotor(id, mes)) {
        if (cond.getAg_promotor().toLowerCase().equals("promotor")) {
          if (cond.getAdicional1() != -1 && existeIdPromotor(cond.getAdicional1())) {
            renglon = sumaPromotor2(id, cond.getAdicional1());
          }
          if (cond.getAdicional2() != -1 && existeIdPromotor(cond.getAdicional2())) {
            renglon = sumaPromotor2(id, cond.getAdicional2());
          }

          double metaperiodo = cond.getMetaPeriodo(mes);
          double alcance;
          renglon.inserta(0, cond.getAg_promotor());
          renglon.inserta(1, cond.getIda());
          //System.out.println("RenglonTransPromotores 1" + renglon.getRenglones()[0] + " " + renglon.getRenglones()[1] + " " + renglon.getRenglones()[2] + " " + renglon.getRenglones()[3]);
          double total = renglon.getTotal();
          meta += cond.getRechazos();
          total /= meta;
          renglon.inserta(19, String.valueOf(cond.getRechazos()));
          renglon.inserta(20, String.valueOf(Double.parseDouble(renglon.getRenglones()[18]) + Double.parseDouble(renglon.getRenglones()[19])));
          double metaAlcance = Double.parseDouble(renglon.getRenglones()[20]);
          renglon.inserta(21, String.valueOf(metaperiodo));
          if (metaperiodo == 0) {
            alcance = 1;
          }
          alcance = metaAlcance / metaperiodo;
          if (alcance > 1) {
            alcance = 1;
          }
          renglon.inserta(22, String.valueOf(alcance));//Porcentaje meta alcanzada
          this.tablaPromotor2.put(id, renglon);
          this.acumuladoPromotor2.add(id);
        }

      }

    }

  }

  /*
   * Toma las condiciones del promotor de la tabla de condiciones.
   */
  public String[] getCondicionesPromotor(int id_promotor, int mes) throws SQLException {
    String query = "SELECT id_agente, tipo, plim_inf_autos1 , "
            + "plim_sup_autos1 , pvalor_autos1 , plim_inf_autos2 , plim_sup_autos2 , pvalor_autos2 , plim_inf_autos3 , "
            + "plim_sup_autos3 , pvalor_autos3 , plim_inf_danos1 , plim_sup_danos1 , pvalor_danos1 , plim_inf_danos2 , "
            + "plim_sup_danos2 , pvalor_danos2 , plim_inf_danos3 , plim_sup_danos3 , pvalor_danos3 , plim_inf_personas1 , "
            + "plim_sup_personas1 , pvalor_personas1 , plim_inf_personas2 , plim_sup_personas2 , pvalor_personas2 , plim_inf_personas3 , "
            + "plim_sup_personas3 , pvalor_personas3 , rechazos,enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre,"
            + "adicional1,adicional2 FROM condiciones WHERE id_promotor=" + id_promotor;
    ResultSet res = st.executeQuery(query);
    ResultSetMetaData metaData = res.getMetaData();
    int columnCount = metaData.getColumnCount();
    if (res.next()) {
      String[] val = new String[columnCount];
      for (int i = 0; i < columnCount; i++) {
        val[i] = res.getString(i + 1);
      }
      /*
      val[0]=res.getString("tipo");
      val[1]=res.getString("ppa");
      val[2]=res.getString("ppd");
      val[3]=res.getString("ppp");
      val[4]=res.getString("rechazos");
      val[5]=res.getString("enero");
      val[6]=res.getString("febrero");
      val[7]=res.getString("marzo");
      val[8]=res.getString("abril");
      val[9]=res.getString("mayo");
      val[10]=res.getString("junio");
      val[11]=res.getString("julio");
      val[12]=res.getString("agosto");
      val[13]=res.getString("septiembre");
      val[14]=res.getString("octubre");
      val[15]=res.getString("noviembre");
      val[16]=res.getString("diciembre");
      val[17]=res.getString("adicional1");
      val[18]=res.getString("adicional2");*/
      return val;
    }
    return null;
  }

  /*
   * Toma las condiones del agente de la tabla de condiciones
   */
  public String[] getCondicionesAgente(int id_agente, int mes) throws SQLException {
    String query = "SELECT tipo, plim_inf_autos1 , "
            + "plim_sup_autos1 , pvalor_autos1 , plim_inf_autos2 , plim_sup_autos2 , pvalor_autos2 , plim_inf_autos3 , "
            + "plim_sup_autos3 , pvalor_autos3 , plim_inf_danos1 , plim_sup_danos1 , pvalor_danos1 , plim_inf_danos2 , "
            + "plim_sup_danos2 , pvalor_danos2 , plim_inf_danos3 , plim_sup_danos3 , pvalor_danos3 , plim_inf_personas1 , "
            + "plim_sup_personas1 , pvalor_personas1 , plim_inf_personas2 , plim_sup_personas2 , pvalor_personas2 , plim_inf_personas3 , "
            + "plim_sup_personas3 , pvalor_personas3 , rechazos,enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre,"
            + "adicional1,adicional2 FROM condiciones WHERE id_agente=" + id_agente;
    ResultSet res = st.executeQuery(query);
    ResultSetMetaData metaData = res.getMetaData();
    int columnCount = metaData.getColumnCount();
    if (res.next()) {
      String[] val = new String[columnCount];
      for (int i = 0; i < columnCount; i++) {
        val[i] = res.getString(i + 1);
      }
      /*val[0]=res.getString("tipo");
      val[1]=res.getString("ppa");
      val[2]=res.getString("ppd");
      val[3]=res.getString("ppp");
      val[4]=res.getString("rechazos");
      val[5]=res.getString("enero");
      val[6]=res.getString("febrero");
      val[7]=res.getString("marzo");
      val[8]=res.getString("abril");
      val[9]=res.getString("mayo");
      val[10]=res.getString("junio");
      val[11]=res.getString("julio");
      val[12]=res.getString("agosto");
      val[13]=res.getString("septiembre");
      val[14]=res.getString("octubre");
      val[15]=res.getString("noviembre");
      val[16]=res.getString("diciembre");
      val[17]=res.getString("adicional1");
      val[18]=res.getString("adicional2");*/
      return val;
    }
    return null;
  }

  private boolean existeIdPromotor(int idPromotor) {
    return this.llavesPromotor1.contains(idPromotor);
  }

  private boolean existeIdAgente(int idAgente) {
    return this.llavesAgente1.contains(idAgente);
  }

  public RenglonTrans sumaAgente1(int id1, int id2) {
    RenglonTrans r1 = this.tablaAgente1.get(id1);
    RenglonTrans r2 = this.tablaAgente1.get(id2);
    double valorId1 = 0;
    double valorId2 = 0;

    for (int i = 4; i <= 18; i++) {
      valorId1 = r1.getRenglones()[i] == null ? 0 : Double.parseDouble(r1.getRenglones()[i]);
      valorId2 = r2.getRenglones()[i] == null ? 0 : Double.parseDouble(r2.getRenglones()[i]);
      r1.getRenglones()[i] = "" + (valorId1 + valorId2);
    }

    for (int i = 24; i <= 26; i++) {
      valorId1 = r1.getRenglones()[i] == null ? 0 : Double.parseDouble(r1.getRenglones()[i]);
      valorId2 = r2.getRenglones()[i] == null ? 0 : Double.parseDouble(r2.getRenglones()[i]);
      r1.getRenglones()[i] = "" + (valorId1 + valorId2);
    }
    return r1;
  }

  public RenglonTrans sumaAgente2(int id1, int id2) {
    RenglonTrans r1 = this.tablaAgente2.get(id1);
    RenglonTrans r2 = this.tablaAgente2.get(id2);
    double valorId1 = 0;
    double valorId2 = 0;

    for (int i = 4; i <= 18; i++) {
      valorId1 = r1.getRenglones()[i] == null ? 0 : Double.parseDouble(r1.getRenglones()[i]);
      valorId2 = r2.getRenglones()[i] == null ? 0 : Double.parseDouble(r2.getRenglones()[i]);
      r1.getRenglones()[i] = "" + (valorId1 + valorId2);
    }
    return r1;
  }

  public RenglonTrans sumaPromotor1(int id1, int id2) {
    RenglonTrans r1 = this.tablaPromotor1.get(id1);
    RenglonTrans r2 = this.tablaPromotor1.get(id2);
    double valorId1 = 0;
    double valorId2 = 0;

    for (int i = 4; i <= 18; i++) {
      valorId1 = r1.getRenglones()[i] == null ? 0 : Double.parseDouble(r1.getRenglones()[i]);
      valorId2 = r2.getRenglones()[i] == null ? 0 : Double.parseDouble(r2.getRenglones()[i]);
      r1.getRenglones()[i] = "" + (valorId1 + valorId2);
    }

    for (int i = 24; i <= 26; i++) {
      valorId1 = r1.getRenglones()[i] == null ? 0 : Double.parseDouble(r1.getRenglones()[i]);
      valorId2 = r2.getRenglones()[i] == null ? 0 : Double.parseDouble(r2.getRenglones()[i]);
      r1.getRenglones()[i] = "" + (valorId1 + valorId2);
    }
    return r1;
  }

  public RenglonTrans sumaPromotor2(int id1, int id2) {
    RenglonTrans r1 = this.tablaPromotor2.get(id1);
    RenglonTrans r2 = this.tablaPromotor2.get(id2);

    for (int i = 4; i <= 18; i++) {
      double valorId1 = r1.getRenglones()[i] == null ? 0 : Double.parseDouble(r1.getRenglones()[i]);
      double valorId2 = r2.getRenglones()[i] == null ? 0 : Double.parseDouble(r2.getRenglones()[i]);
      r1.getRenglones()[i] = "" + (valorId1 + valorId2);
    }
    return r1;
  }
}